package com.wfh.constant;

import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;

/**
 * @Author FengHuan Wang
 * @Date 2025/4/19 15:39
 * @Version 1.0
 */
public interface RedisLuaScriptConstant {

    /**
     * 点赞 Lua 脚本
     */
    public static final RedisScript<Long> THUMB_SCRPIT = new DefaultRedisScript<>("""
            -- 临时计数键
            local tempThumbKey = KEYS[1]
            -- 用户点赞状态键
            local userThumbKey = KEYS[2]
            -- 用户id
            local userId = ARGV[1]
            -- 博客id
            local blogId = ARGV[2]

            -- 检查是否已经点赞（避免重复操作）
            if redis.call('HEXISTS', userThumbKey, blogId) == 1 then
                -- 已经点赞，返回 -1 表示失败
                return -1
            end

            -- 获取旧的值
            local hasKey = userId .. ':' .. blogId
            local oldNumber = tonumber(redis.call('HGET', tempThumbKey, hasKey) or 0)

            -- 计算新的值
            local newNumber = oldNumber + 1

            -- 原子性更新：写入临时计数 + 标记用户已经点赞
            redis.call('HSET', tempThumbKey, hasKey, newNumber)
            redis.call('HSET', userThumbKey, blogId, 1)

            -- 返回 1 表示成功
            return 1
            """, Long.class);

    /**
     * 取消点赞 Lua 脚本
     */
    public static final RedisScript<Long> UNTHUMB_SCRIPT = new DefaultRedisScript<>("""
            -- 临时计数键
            local tempThumbKey = KEYS[1]
            -- 用户点赞状态键
            local userThumbKey = KEYS[2]
            -- 用户id
            local userId = ARGV[1]
            -- 博客id
            local blogId = ARGV[2]

            -- 检查用户是否已经点赞，如果没有点赞，直接返回失败
            if redis.call('HEXISTS', userThumbKey, blogId) ~= 1 then
                return -1
            end

            -- 获取当前临时计数
            local hasKey = userId .. ':' .. blogId
            local oldNumber = tonumber(redis.call('HGET', tempThumbKey, hasKey) or 0)

            -- 计算新的值并更新
            local newNumber = oldNumber - 1

            -- 原子性操作：更新临时计数 + 删除用户点赞标记
            redis.call('HSET', tempThumbKey, hasKey, newNumber)
            redis.call('HDEL', userThumbKey, blogId)

            -- 返回 1 表示成功
            return 1
            """, Long.class);


    /**
     * 点赞 Lua 脚本
     * KEYS[1]       -- 用户点赞状态键
     * ARGV[1]       -- 博客 ID
     * 返回:
     * -1: 已点赞
     * 1: 操作成功
     */
    public static final RedisScript<Long> THUMB_SCRIPT_MQ = new DefaultRedisScript<>("""  
                local userThumbKey = KEYS[1]  
                local blogId = ARGV[1]  
          
                -- 判断是否已经点赞  
                if redis.call("HEXISTS", userThumbKey, blogId) == 1 then  
                    return -1  
                end  
          
                -- 添加点赞记录  
                redis.call("HSET", userThumbKey, blogId, 1)  
                return 1  
        """, Long.class);

    /**
     * 取消点赞 Lua 脚本
     * KEYS[1]       -- 用户点赞状态键
     * ARGV[1]       -- 博客 ID
     * 返回:
     * -1: 已点赞
     * 1: 操作成功
     */
    public static final RedisScript<Long> UNTHUMB_SCRIPT_MQ = new DefaultRedisScript<>("""  
        local userThumbKey = KEYS[1]  
        local blogId = ARGV[1]  
          
        -- 判断是否已点赞  
        if redis.call("HEXISTS", userThumbKey, blogId) == 0 then  
            return -1  
        end  
          
        -- 删除点赞记录  
        redis.call("HDEL", userThumbKey, blogId)  
        return 1  
        """, Long.class);

}